#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
数据匹配模块
负责包装方案匹配算法和分类逻辑实现
"""

import pandas as pd
import logging
from src.config.constants import MATCH_STATUS

# 导入子模块中的功能
from src.data_processing.data_matching.matcher import (
    DataMatcher as MatcherImpl,
)
from src.data_processing.data_matching.classification import classify_products
from src.data_processing.data_matching.iterative_splitting import (
    iterative_splitting,
)
from src.data_processing.data_matching.combination_recommendation import (
    recommend_combination_packages,
)
from src.data_processing.data_matching.package_type import (
    identify_package_type,
)


class DataMatcher:
    """负责包装方案匹配算法和分类逻辑实现"""

    def __init__(self):
        """初始化数据匹配器"""
        # 初始化子模块中的数据匹配器实现
        self.matcher = MatcherImpl()
        self.logger = logging.getLogger("DataMatcher")

    def match_specification(self, target_data, historical_data):
        """规格型号匹配

        Args:
            target_data: 目标数据（任务数据）
            historical_data: 历史包装数据

        Returns:
            包含匹配信息的DataFrame
        """
        self.logger.info("开始规格型号匹配")
        result = self.matcher.match_specification(target_data, historical_data)
        self.logger.info("规格型号匹配完成")
        return result

    def _determine_product_category(self, matched_historical):
        """确定产品归类

        内部方法，实际调用matcher中的实现

        Args:
            matched_historical: 匹配的历史记录

        Returns:
            产品归类（仅组合包装、仅独立包装、混合包装）
        """
        return self.matcher._determine_product_category(matched_historical)

    def identify_package_type(self, data, merged_cells_info=None):
        """识别包装类型

        根据项目大纲2.3.1.3节定义：
        - 组合包装：当"包装箱方案"列的某单元格为合并单元格时，该合并单元格所包含的所有行构成一个组合包装
        - 独立包装：当"包装箱方案"列的某单元格为非合并单元格时，该行构成一个独立包装

        Args:
            data: 待识别的数据
            merged_cells_info: 合并单元格信息

        Returns:
            包含包装类型信息的数据
        """
        self.logger.info("开始识别包装类型")
        result = identify_package_type(data, merged_cells_info)
        self.logger.info("包装类型识别完成")
        return result

    def identify_package_type_from_file(
        self, file_path, sheet_name=0, header=0
    ):
        """从文件中识别包装类型

        这个方法会读取Excel文件并保留合并单元格信息，然后基于合并单元格特征判断包装类型

        Args:
            file_path: Excel文件路径
            sheet_name: 工作表名称或索引，默认为0
            header: 表头行索引，默认为0

        Returns:
            包含包装类型信息的数据
        """
        self.logger.info(f"从文件 {file_path} 中识别包装类型")
        from src.data_processing.data_matching.package_type import (
            identify_package_type_from_file,
        )

        result = identify_package_type_from_file(file_path, sheet_name, header)
        self.logger.info("文件包装类型识别完成")
        return result

    def classify_data(self, matched_data):
        """对匹配后的数据进行分类

        Args:
            matched_data: 匹配后的数据

        Returns:
            分类后的数据
        """
        self.logger.info("开始对匹配后的数据进行分类")
        result = classify_products(matched_data)
        self.logger.info("数据分类完成")
        return result

    def _is_reuse_item(self, row):
        """判断是否为复用项

        内部方法，实际调用matcher中的实现

        Args:
            row: 数据行

        Returns:
            是否为复用项
        """
        return self.matcher._is_reuse_item(row)

    def iterative_splitting(self, target_data, historical_data=None):
        """迭代拆分功能

        Args:
            target_data: 目标数据
            historical_data: 历史数据

        Returns:
            拆分后的数据
        """
        self.logger.info("开始执行迭代拆分")
        result = iterative_splitting(target_data, historical_data)
        self.logger.info("迭代拆分完成")
        return result

    def recommend_combination_packages(self, data):
        """推荐组合包装方案

        Args:
            data: 待处理的数据

        Returns:
            添加了推荐组合包装的数据
        """
        self.logger.info("开始推荐组合包装方案")
        result = recommend_combination_packages(data)
        self.logger.info("组合包装推荐完成")
        return result

    def execute_matching_strategy(self, classified_data):
        """执行匹配策略，遵循项目大纲中的分类处理阶段要求

        Args:
            classified_data: 已分类的数据

        Returns:
            匹配结果
        """
        self.logger.info("开始执行匹配策略")
        result = self.matcher.execute_matching_strategy(classified_data)
        self.logger.info("匹配策略执行完成")
        return result

    def analyze_matching_results(self, results):
        """分析匹配结果，生成统计报告

        Args:
            results: 匹配结果

        Returns:
            匹配结果统计报告
        """
        self.logger.info("开始分析匹配结果")
        result = self.matcher.analyze_matching_results(results)
        self.logger.info("匹配结果分析完成")
        return result

    def calculate_weighted_similarity(self, text1, text2, weights=None):
        """计算加权综合相似度

        Args:
            text1: 第一个文本
            text2: 第二个文本
            weights: 各相似度指标的权重字典

        Returns:
            加权综合相似度得分（0-1之间的浮点数）
        """
        return self.matcher.calculate_weighted_similarity(
            text1, text2, weights
        )

    def update_matching_thresholds(self, new_thresholds):
        """动态更新匹配阈值

        Args:
            new_thresholds: 新的阈值配置字典
        """
        self.logger.info("更新匹配阈值")
        self.matcher.update_matching_thresholds(new_thresholds)
        self.logger.info("匹配阈值更新完成")
